#include <stdio.h>
#include <stdlib.h>
#include "TadPilaLista.h"

/* Inicializa el tope de la pila en NULL, y el contador en 0 */
void initPila(Pila *pila)
{
	pila->tope = NULL;
	pila->tamanio= 0;
}

/* Retorna 1 (true) si la pila esta vacia, 0 (false) de lo contrario */
boolean es_vaciaPila(Pila *pila)
{
	if (pila == NULL){
		return 1;
 	}else{ 
		return 0;	
	}
}

/* Toma una pila y un elemento, y apila el mismo en ella */
void push (Pila *pila, Lista *valor)
{
	ItemPila * nuevo = (ItemPila *) malloc (sizeof(struct ElemPila));
	if (nuevo == NULL)
		printf ("Error: no hay memoria disponible. \n");
		/* termimar, ver exit()*/

	nuevo->dato = valor;
	nuevo->sig = pila->tope;
	pila->tope = nuevo;
	pila->tamanio++;
}

/* Toma una pila y elimina su tope */
void pop (Pila *pila)
{
	if (pila->tamanio == 0){
		/* cortar la ejecucion del programa no hay nada para borrar*/	
		printf("Error: no hay nada para eliminar");
	}else{
		ItemPila * aux;
		aux = pila->tope;
		pila->tope = pila->tope->sig;
		free(aux->dato);
		free(aux);
		pila->tamanio--;
	}
}

/* Toma una pila y la muestra por pantalla */
void mostrarPila(Pila *pila)
{	
	ItemPila * actual;
	int i;
	actual = pila->tope;
	if (pila->tamanio == 0)
		printf ("Pila vacia\n");
	for(i=0;i<pila->tamanio;++i){
		mostrarLista(actual->dato);
		/*printf("\t\t%s\n", actual->dato);*/
		actual = actual->sig;
  	}
}


/* Toma una pila y un elemento(lista), y retorna true si el elemento ya pertenece a la pila, de lo contrario false */
boolean pertenecePila (Pila *pila, Lista*lista)
{
	if ((pila == NULL) || (lista == NULL))
		return 0;
	ItemPila *aux = pila->tope;
	ItemLista *aux2;
	int i, j;
	for (i = 0; i < pila->tamanio; ++i){
		aux2 = lista->primero;
		for (j = 0; j < lista->tamanio; ++j){
			/*printf("AAAAA: %i\n",perteneceLista(aux->dato,aux2->dato.id));*/
			if (perteneceLista(aux->dato,aux2->dato.id) == 1){  /*Comparo una lista (de la pila), con todos los elem de la pasada como par*/
				return 1;
			}
			aux2=aux2->sig;			
		}
		aux=aux->sig;	
		
	}
	return 0; 
}

/* Toma una pila, y libera todo la memoria que utiliza */
void liberarPila (Pila *pila)
{
	ItemPila *aux1, *aux2;
	aux1 = pila->tope;
	while (aux1 != NULL) {
		aux2 = aux1->sig;
		free(aux1);
		aux1 = aux2;
	}
}

/* Inicializa el primero de la lista en NULL, y el contador en 0 */
void initLista(Lista *lista)
{
	lista->primero = NULL;
	lista->ultimo = NULL;
	lista->tamanio= 0;
}

/* Retorna 1 (true) si la lista esta vacia, 0 (false) de lo contrario */
boolean es_vaciaLista(Lista *lista)
{
	if (lista == NULL){
		return 1;
 	}else{ 
		return 0;	
	}
}

/* Toma una lista y un id y un char(tipo), e inserta el mismo en ella */
void insertar (Lista *lista, char *var, char *type)
{

	ItemLista *nuevo = (ItemLista *) malloc (sizeof(struct ElemLista));	

	if (nuevo == NULL){	       
		printf ("Error: no hay memoria disponible. \n");
		exit(1);
	}
	nuevo->dato.id = var;
	nuevo->dato.tipo = type;
	if (lista->ultimo == NULL){
		nuevo->sig = NULL;
		lista->primero = nuevo;
		lista->ultimo = nuevo;
	}else{
		lista->ultimo->sig = nuevo;
		nuevo->sig = NULL;
		lista->ultimo = nuevo;
	}
	lista->tamanio++; 
}

/* Toma una lista y elimina su primer elemento */
void eliminar (Lista *lista)
{
	if (lista->tamanio == 0){
		printf("Error: no hay nada para eliminar");
		exit(1);
	}else{
		ItemLista * aux;
		aux = lista->primero;
		lista->primero = lista->primero->sig;
		/*free(aux->dato);*/
		free(aux);
		lista->tamanio--;
	}
}

/* Toma una lista y la muestra por pantalla */
void mostrarLista(Lista *lista)
{	
	ItemLista * actual;
	int i;
	actual = lista->primero;
	if (lista->tamanio == 0)
		printf ("Pila vacia\n");
	for(i=0;i<lista->tamanio;++i){
		printf("(");	
		printf("%s", actual->dato.id);
		printf(",");	
		printf("%s", actual->dato.tipo);
		printf(")");	
		actual = actual->sig;
  	}
	printf("\n");
}

/* Toma una lista y un elemento, y retorna true si el elemento ya pertenece a la pila, de lo contrario false */
boolean perteneceLista (Lista *lista, char *elem)
{
	if (lista == NULL)
		return 0;
	ItemLista *aux = lista->primero;
	int i;
	for (i = 0; i< lista->tamanio; ++i){
		if (strcmp(aux->dato.id,elem) == 0)
			return 1;
		aux=aux->sig;	
	}
	return 0;
}

/* Toma una lista, y libera todo la memoria que utiliza */
void liberarLista(Lista *lista)
{
	ItemLista *aux1, *aux2;
	aux1 = lista->primero;
	while (aux1 != NULL) {
		aux2 = aux1->sig;
		free(aux1);
		aux1 = aux2;
	}
}
